001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Jan 16, 2003
005     * Time: 8:39:52 PM
006     */
007    
008    package EVolve.util.predefinedutils;
009    
010    import EVolve.Scene;
011    import EVolve.exceptions.*;
012    import EVolve.visualization.*;
013    import EVolve.visualization.Dimension;
014    import javax.swing.*;
015    import java.util.*;
016    import java.io.*;
017    import java.awt.*;
018    import java.awt.event.*;
019    
020    public class VisualizationSerializer {
021        private static VisualizationSerializer instance = null;
022        private JDialog dialog;
023        private JCheckBox checkSelection;
024        private JTextField textConfigureName, textSelectionName;
025        private JTextField textConfigureFile, textSelectionFile;
026        private JButton buttonConfigure, buttonSelection;
027        private JButton buttonSave, buttonCancel;
028        private FileWriter fileConfigure, fileSelection;
029    
030        private VisualizationSerializer() {
031            dialog = null;
032        }
033    
034        public static VisualizationSerializer v() {
035            if (instance == null) instance = new VisualizationSerializer();
036            return instance;
037        }
038    
039        public void readSetting() {
040    
041        }
042    
043        public void showSavingDialog() {
044            if (dialog == null) {
045                createDialog();
046            } else {
047                if (Scene.getFilter().getSelection().length == 0) {
048                    checkSelection.setSelected(false);
049                    textSelectionName.setEnabled(false);
050                    textSelectionFile.setEnabled(false);
051                    buttonSelection.setEnabled(false);
052                }
053                dialog.setVisible(true);
054            }
055        }
056    
057        private void createDialog() {
058            Box boxMain = new Box(BoxLayout.Y_AXIS);
059    
060            dialog = new JDialog(Scene.getFrame(), "Setting Saving...", true);
061            dialog.setBounds(new Rectangle(500,250));
062    
063    
064            boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
065                    "Save configuration and selections"));
066            dialog.getContentPane().add(boxMain,BorderLayout.CENTER);
067    
068            //***********************************
069            Box boxConfigureName = new Box(BoxLayout.X_AXIS);
070            boxConfigureName.add(new JLabel("Configuration name:"));
071            textConfigureName = new JTextField(12);
072            boxConfigureName.add(Box.createHorizontalStrut(25));
073            boxConfigureName.add(textConfigureName);
074    
075            Box boxConfig = new Box(BoxLayout.X_AXIS);
076            boxConfig.add(new JLabel("Choose configure file:"));
077            textConfigureFile = new JTextField(12);
078            boxConfig.add(Box.createHorizontalStrut(20));
079            boxConfig.add(textConfigureFile,BorderLayout.CENTER);
080            buttonConfigure = new JButton("...");
081            buttonConfigure.addActionListener(new ActionListener(){
082                public void actionPerformed(ActionEvent e) {
083                    JFileChooser fc = selectFile();
084                    if (fc == null) return;
085                    textConfigureFile.setText(fc.getSelectedFile().getPath());
086                }
087            });
088            boxConfig.add(buttonConfigure,BorderLayout.EAST);
089    
090            //*****************************
091            Box boxChk = new Box(BoxLayout.X_AXIS);
092            checkSelection = new JCheckBox("Saving Filters & colors also");
093            checkSelection.setMnemonic(KeyEvent.VK_F);
094            checkSelection.addActionListener(new ActionListener() {
095                public void actionPerformed(ActionEvent e) {
096                    boolean enable = checkSelection.isSelected();
097                    if (Scene.getFilter().getSelection().length == 0) {
098                        Scene.showErrorMessage("No active selection exists!");
099                        checkSelection.setSelected(false);
100                    } else {
101                        buttonSelection.setEnabled(enable);
102                        textSelectionFile.setEnabled(enable);
103                        textSelectionName.setEnabled(enable);
104                    }
105                }
106            });
107            boxChk.add(checkSelection);
108            JLabel note = new JLabel("(If checked, the configuration file can ONLY be applied to " +
109                          " the current data source.)");
110            note.setFont(new Font("Dialog",Font.ITALIC|Font.BOLD,9));
111            boxChk.add(note);
112    
113            //***********************************
114            Box boxSelectionName = new Box(BoxLayout.X_AXIS);
115            boxSelectionName.add(new JLabel("Selection name:"));
116            boxSelectionName.add(Box.createHorizontalStrut(25));
117            textSelectionName = new JTextField(12);
118            boxSelectionName.add(textSelectionName);
119    
120            Box boxSelection = new Box(BoxLayout.X_AXIS);
121            boxSelection.add(new JLabel("Choose selection file:"));
122            textSelectionFile = new JTextField(12);
123            boxSelection.add(Box.createHorizontalStrut(20));
124            boxSelection.add(textSelectionFile,BorderLayout.CENTER);
125            buttonSelection = new JButton("...");
126            buttonSelection.addActionListener(new ActionListener() {
127                public void actionPerformed(ActionEvent e) {
128                    JFileChooser fc = selectFile();
129                    if (fc == null) return;
130                    textSelectionFile.setText(fc.getSelectedFile().getPath());
131                }
132            });
133            boxSelection.add(buttonSelection,BorderLayout.EAST);
134    
135            //***********************************
136            Box boxSaveCancel = new Box(BoxLayout.X_AXIS);
137            buttonSave = new JButton("Save");
138            buttonSave.addActionListener(new ActionListener() {
139                public void actionPerformed(ActionEvent e) {
140                    if (!validate()) return;
141                    dialogSave();
142                }
143            });
144    
145            buttonCancel = new JButton("Cancel");
146            buttonCancel.addActionListener(new ActionListener() {
147                public void actionPerformed(ActionEvent e) {
148                    dialog.setVisible(false);
149                }
150            });
151            boxMain.add(Box.createHorizontalStrut(40));
152            boxSaveCancel.add(buttonSave);
153            boxSaveCancel.add(Box.createHorizontalStrut(25));
154            boxSaveCancel.add(buttonCancel);
155    
156            boxMain.add(boxConfigureName);
157            boxMain.add(Box.createVerticalStrut(5));
158            boxMain.add(boxConfig);
159            boxMain.add(Box.createVerticalStrut(15));
160            boxMain.add(boxChk);
161            boxMain.add(Box.createVerticalStrut(8));
162            boxMain.add(boxSelectionName);
163            boxMain.add(Box.createVerticalStrut(5));
164            boxMain.add(boxSelection);
165            boxMain.add(Box.createVerticalStrut(25));
166            boxMain.add(boxSaveCancel);
167    
168            textSelectionName.setEnabled(false);
169            textSelectionFile.setEnabled(false);
170            buttonSelection.setEnabled(false);
171            dialog.getContentPane().add(boxMain);
172            dialog.setResizable(false);
173            dialog.pack();
174            Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight());
175        }
176    
177        private JFileChooser selectFile() {
178            JFileChooser fc = new JFileChooser();
179            if (fc.showSaveDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) {
180                return fc;
181            }
182            return null;
183        }
184    
185        private void dialogSave() {
186            saveConfiguration();
187            if (checkSelection.isSelected())
188                saveSelection();
189            dialog.setVisible(false);
190        }
191    
192        private boolean validate() {
193            if ((textConfigureFile.getText() == null) || (textConfigureName.getText() == null)) {
194                Scene.showErrorMessage("User must name the configuration to be saved and choose a file!");
195                return false;
196            }
197    
198            if (checkSelection.isSelected() &&
199                ((textSelectionFile.getText() == null) || (textSelectionName.getText() == null))) {
200                Scene.showErrorMessage("User must name the filters to be saved and select a file to save them!");
201                return false;
202            }
203    
204            return true;
205        }
206    
207        private void saveConfiguration() {
208            ArrayList vizList = Scene.getVisualizationManager().getVisualizationList();
209            if (vizList.size() == 0) {
210                Scene.showErrorMessage("Nothing to be saved!");
211                return;
212            }
213    
214            try {
215                fileConfigure = new FileWriter(textConfigureFile.getText().trim(),false);
216            } catch (IOException ioe) {
217                Scene.showErrorMessage("Can not access file \""+textConfigureFile.getText()+"\"");
218                return;
219            }
220    
221            try {
222                String configureName = textConfigureName.getText().trim();
223                fileConfigure.write(Scene.VERSION+"\n");
224                fileConfigure.write("File Type:Configuration\n");
225                fileConfigure.write("Store:;\n");
226                fileConfigure.write(configureName+"\n");
227                fileConfigure.write("Datasource:"+(checkSelection.isSelected() ? Scene.getCurrentDataFilename() : ";")+"\n");
228                fileConfigure.write("Selection:"+(checkSelection.isSelected() ? textSelectionFile.getText() : ";")+"\n");
229                for (int i = 0; i<vizList.size(); i++) {
230                    Visualization visual = (Visualization)vizList.get(i);
231                    HashMap config = visual.getCurrentConfigure();
232                    fileConfigure.write(visual.getFactory().getFactoryName()+"\n");
233                    fileConfigure.write(visual.getSubjectDefinition().getName()+"\n");
234                    Dimension[] dim = (Dimension[])config.get("Dimension");
235                    for (int j=0;j<dim.length;j++) {
236                        fileConfigure.write(dim[j].getDataFilter().getName()+"\n");
237                    }
238                    for (int j=dim.length; j<3; j++) fileConfigure.write(";not using this dimension\n");
239                    if (config.get("Predictor") != null)
240                        fileConfigure.write(((PredictorFactory)config.get("Predictor")).getName()+"\n");
241                    else
242                        fileConfigure.write(";not using predictor\n");
243    
244                    String intervalString = "";
245                    intervalString += config.get("Interval").toString();
246                    if (config.get("BeginCall")!=null) {
247                        intervalString = intervalString + ";" + config.get("BeginCall").toString() + ",";
248                        intervalString = intervalString + config.get("EndCall").toString();
249                    }
250                    if (config.get("Match") != null) {
251                        intervalString = "," + intervalString + config.get("Match").toString();
252                    }
253                    fileConfigure.write(intervalString+"\n");
254    
255                    fileConfigure.write(visual.getWindow().getTitle()+"\n");
256                    Rectangle rect = visual.getWindow().getBounds();
257                    fileConfigure.write(new Integer(rect.x).toString() + "\n");
258                    fileConfigure.write(new Integer(rect.y).toString() + "\n");
259                    fileConfigure.write(new Integer(rect.width).toString() + "\n");
260                    fileConfigure.write(new Integer(rect.height).toString() + "\n");
261                    fileConfigure.write((String)config.get("Options")+"\n");
262                }
263                Scene.getUIManager().refreshMenu(textConfigureFile.getText(),configureName);
264                fileConfigure.flush();
265                fileConfigure.close();
266            } catch (IOException e) {
267                Scene.showErrorMessage("Error occurred when trying to save configuration!");
268            }
269    
270        }
271    
272        private void saveSelection() {
273            try {
274                fileSelection = new FileWriter(textSelectionFile.getText().trim(),false);
275            } catch (IOException ioe) {
276                Scene.showErrorMessage("Can not access file \""+textSelectionFile.getText()+"\"");
277                return;
278            }
279            Scene.getFilter().saveSelection(fileSelection,textSelectionName.getText().trim());
280        }
281    
282        public void loadConfiguration() {
283            JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastConfigDir());
284            String configureName = null,filename = null;
285    
286            if(fc.showOpenDialog(Scene.getFrame()) != JFileChooser.APPROVE_OPTION) return;
287    
288            try {
289                filename = fc.getSelectedFile().getPath();
290                Scene.getUIManager().setLastConfigDir(filename);
291                SerializerInfo info = getVizInfoFromDisk(filename);
292                configureName = info.name;
293            } catch (Exception e) {
294                Scene.showErrorMessage(e.getMessage());
295                return;
296            }
297            Scene.getUIManager().refreshMenu(filename,configureName);
298        }
299    
300        public void loadData(String dataFile) throws EVolveException{
301            if (dataFile.charAt(0)!= ';') {
302                // autoload data source
303                if (!Scene.getCurrentDataFilename().equals(dataFile)) {
304                    Scene.setDataFilename(dataFile);
305                    Scene.autoLoadDataSource();
306                    Scene.setDataFilename(null);
307                }
308                //String selection = selFile.substring(selFile.indexOf(':')+1);
309                //RandomAccessFile file = new RandomAccessFile(selection,"r");
310                //Scene.getFilter().loadSelection(file);
311            }
312        }
313    
314        public void loadSelection(String selFile) throws EVolveException{
315            try {
316                if (selFile.charAt(0)!= ';') {
317                    RandomAccessFile file = new RandomAccessFile(selFile,"r");
318                    Scene.getFilter().loadSelection(file);
319                }
320            } catch (IOException e) {
321                Scene.showErrorMessage("IO exception occurred when trying to load selections and data source.");
322            }
323        }
324    
325        public SerializerInfo getVizInfoFromDisk(String filename) throws EVolveException {
326            String nextLine;
327            int lineno = 0;
328            SerializerInfo info = null;
329    
330            try {
331                info = new SerializerInfo();
332                RandomAccessFile file = new RandomAccessFile(filename,"r");
333                info.version = file.readLine(); // get version number
334                if (!info.version.equals(Scene.VERSION)) throw (new WrongVersionException(info.version));
335                lineno++;
336    
337                String fileType = file.readLine(); //get file type
338                fileType = fileType.substring(fileType.indexOf(':')+1);
339                if (fileType.charAt(0) != 'C') throw new FileTypeMismatchException("Configuration file", fileType+" file");
340    
341                info.resultPath = file.readLine(); // get path where viz result is to be saved
342                info.resultPath = info.resultPath.substring(info.resultPath.indexOf(':')+1);
343                lineno++;
344                info.name = file.readLine().trim(); // get viz setting name
345                lineno++;
346                info.dsource = file.readLine(); //get data source file name, if any
347                info.dsource = info.dsource.substring(info.dsource.indexOf(':')+1);
348                lineno++;
349                info.selectionFile = file.readLine(); //get selection file name, if any
350                info.selectionFile = info.selectionFile.substring(info.selectionFile.indexOf(':')+1);
351                lineno++;
352                if (info.dsource.indexOf(';') == -1 )
353                    info.specific = true;// a specific configuration
354    
355                loadData(info.dsource);
356                loadSelection(info.selectionFile);
357    
358                if (!Scene.getDataManager().isDataLoaded()) return info;
359    
360                nextLine = file.readLine();
361                lineno++;
362                while (nextLine != null) {
363                    VizInfo vizInfo = new VizInfo();
364                    vizInfo.createFactory(nextLine.trim());
365                    lineno++;
366                    vizInfo.createSubjectDefinition(file.readLine().trim());
367                    lineno++;
368                    String[] dimensionDefs = new String[3];
369                    for (int i=0; i<dimensionDefs.length; i++) {
370                        dimensionDefs[i] = file.readLine().trim();
371                        lineno++;
372                    }
373                    vizInfo.createDimension(dimensionDefs);
374                    vizInfo.createPredictor(file.readLine().trim());
375                    lineno++;
376                    vizInfo.createInterval(file.readLine().trim());
377                    lineno++;
378                    vizInfo.createTitle(file.readLine().trim());
379                    lineno++;
380                    vizInfo.createWindowPosition(file.readLine().trim(),file.readLine().trim(),
381                                                 file.readLine().trim(),file.readLine().trim());
382                    lineno+=4;
383                    vizInfo.createOptions(file.readLine().trim());
384                    lineno++;
385    
386                    info.vizInfoList.add(vizInfo);
387                    nextLine = file.readLine();
388                    lineno++;
389                }
390                file.close();
391            } catch (EVolveException e) {
392                String detail = e.getMessage();
393                throw new ReadConfigureFileException(filename, String.valueOf(lineno),"Detailed Information:\n"+detail);
394            } catch (IOException e) {
395                Scene.showErrorMessage(e.getMessage());
396            } catch (Exception e) {
397                throw new ReadConfigureFileException(filename, String.valueOf(lineno),"Detailed Information:N/A");
398            }
399            return info;
400        }
401    }